package com.guang.syncronized.review;

import org.openjdk.jol.info.ClassLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.TimeUnit;

/**
 * @Description 默认不开启偏向延迟。在进入到同步块中去会升级成轻量级锁
 *              证明：偏向锁是无法重偏向的，换句话说是不可逆的
 *
 *              但是这里发现了一个问题：
 *                  t1线程和t2线程中的对象头
 *
 * @Author liguang
 * @Date 2022/10/22/08:27
 */
public class SyncronziedReviewTestFour {

    private final static Logger logger = LoggerFactory.getLogger(SyncronziedReviewTestFour.class);



    public static void main(String[] args) throws InterruptedException {
        TimeUnit.SECONDS.sleep(5);
        Object lock = new Object();
        logger.info("打印当前对象的对象头，101.无锁可偏向，{}",ClassLayout.parseInstance(lock).toPrintable());
        new Thread(()->{
            synchronized (lock){
                logger.info("t1打印当前对象的对象头，101不可偏向的偏向锁，{}",ClassLayout.parseInstance(lock).toPrintable());
            }
        },"t1").start();
        TimeUnit.SECONDS.sleep(7);
        new Thread(()->{
            synchronized (lock){
                logger.info("t2打印当前对象的对象头，000轻量级锁，{}",ClassLayout.parseInstance(lock).toPrintable());
            }
        },"t2").start();

        TimeUnit.SECONDS.sleep(7);
        logger.info("这里就有点问题了！两个线程死了，但是为什么会成为偏向锁？");
        logger.info("答曰：轻量级锁使用完成之后会还原？但是为什么会还原呢？");
        logger.info("main打印当前对象的对象头，000不可偏向的偏向锁，{}",ClassLayout.parseInstance(lock).toPrintable());
        synchronized (lock){
            logger.info("main打印当前对象的对象头，000不可偏向的偏向锁，{}",ClassLayout.parseInstance(lock).toPrintable());
        }

    }
}
